# 1. 如何为函数定义keyword-only参数（写出个例子即可）？
# keyword-only参数：在函数定义时，前面的形参为可变位置参数，后面再紧跟形参，此时这个形参只能通过关键字参数进行传参,如果还需要使用可变关键字形参的话，这个形参需要放在可变关键字形参前面
#                  如果不使用关键字参数传参，使用普通位置参数的话就会被*args打包成元组
#                  由于keyword-only参数是使用关键字进行传参，如果keyword-only参数放在可变关键字形参后面的话，可变关键字形参会把所有的关键字传参截获
def foo(*args, a, b, **kwargs):  # 这个a，b就是keyword-only参数
    print(a, b, args, kwargs)


foo(1, 2, a=3, b=4, c=5)  # 3 4 (1, 2) {'c': 5}


def foo1(*args, a, b):
    print(a, b, args)


# foo1(3,4,5) # 这样传参错误，TypeError: foo() missing 2 required keyword-only arguments: 'a' and 'b'
# def foo2(**kwargs,a, b): # 这样传参错误，可变关键字参数会截获所有的关键字传参
#     print(a,b,kwargs)


# 2. 什么是LEGB，请解释
# LEGB：表示在函数内变量的作用域
#     L:local,局部作用域，指在内部嵌套函数中的变量作用的范围
#     E：enclosing，函数作用域，在整个函数中变量的作用范围
#     G:Global，全局作用域，指在这个Py文件中的作用范围
#     B：Build-in，内建作用域，在整个Python环境中的作用范围
# 变量查找方式：以L—>E—>G—>B,在局部找不到，便会去局部外的局部找（例如闭包），再找不到就会去全局找，再者去内建中找

num1 = 10  # G:Global,全局作用域:可以在当前py文件的任意位置访问
def outter():
    num1 = 20  # E:Enclosing,函数作用域:只能在outter函数中访问
    def inner():
        num1 = 30  # L:Local,局部作用域:只能在inner函数内部访问
        print('inner:', num1)  # 打印inner内部的num1
    print("outter:", num1)  # 打印outer函数内的num1
    return inner

f = outter()
f()
print("global:", num1)  # 打印全局的num1


# 3. 使用本周学习的技术改造第一周的计算器实现，其目标如下：
# 1. 运行后提示让用户输入一个数字
# 2. 提示输入操作符（+ - * /）
# 3. 再次提示输入一个数字
# 4. 打印计算结果
# 5. 在不退出程序的前提下，可以允许用户继续输入新一组数据计
# 6. 尽可能改善用户体验（新需求）


def calculator():

    while True:
        try:
            num1 = float(input("请输入第一个数字："))
        except ValueError:
            print("无效的数字，请重新输入！")
            continue
        operator = input("请输入操作符（+ - * /）：")

        if operator not in ["+", "-", "*", "/"]:
            print("无效的操作符，请重新输入！")
            continue

        try:
            num2 = float(input("请输入第二个数字："))
        except ValueError:
            print("无效的数字，请重新输入！")
            continue

        if operator == "+":
            result = num1 + num2
        elif operator == "-":
            result = num1 - num2
        elif operator == "*":
            result = num1 * num2
        elif operator == "/":
            if num2 != 0:
                result = num1 / num2
            else:
                print("除数不能为零！")
                continue
        print("计算结果: {:.2f}".format(result))
        choice = input("是否继续计算？(y/n): ")
        if choice.lower() != "y":
            break

calculator()
